import java.util.Stack;

/**
 * Created with IntelliJ IDEA.
 * Description: 两个栈实现队列 力扣232题
 *
 *      第一个栈一直入栈，第二个栈一直出栈：
 *                1、将数据一直入到第一个栈(模拟实现的就是入队操作)；；
 *                2、当第二个栈为空是，将第一个栈的数据依次出栈后 再将之依次入栈到第二个栈中，
 *                   再将第二个栈中的数据出栈（即出队操作）；
 * User: 86187
 * Date: 2022-07-30
 * Time: 22:19
 */

class MyQueue {

    Stack<Integer> stack1;
    Stack<Integer> stack2;

    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

    //两个栈实现入队操作
    public void push(int x) {
        stack1.push(x); // 第一个栈一直入栈(实现的是入队操作)
    }

    ////两个栈实现出队操作
    public int pop() {
        if(empty()) {
            return -1; //当前（栈实现的）队列为空
        }
        if(stack2.empty()) {
            //当第二个栈为空是，将第一个栈的数据依次出栈后 再将之依次入栈到第二个栈中
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();//再将第二个栈中的数据出栈（即出队操作）
    }

    //两个栈实现 获取队头的元素
    public int peek() {
        if(empty()) {
            return -1; //当前（栈实现的）队列为空
        }
        if(stack2.empty()) {
            //当第二个栈为空是，将第一个栈的数据依次出栈后 再将之依次入栈到第二个栈中
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.peek(); //获取队头的元素
    }

    //判空
    public boolean empty() {
        return stack1.empty() && stack2.empty();
    }
}
